
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Nginx 如何与后端应用服务器（如 Tomcat、Node.js）进行通信？ - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>Nginx 如何与后端应用服务器（如 Tomcat、Node.js）进行通信？ - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在 Nginx 中，哪个指令用于实现基本的反向代理，即将客户端请求转发到后端应用服务器？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Nginx 通过 `proxy_pass` 指令将请求转发到后端应用服务器。例如，在 location 块中使用 `proxy_pass http://backend;` 会将该 location 匹配到的请求转发到名为 backend 的服务器或服务器组。</div>
          </div>
          <div class="card-source">来源: 1.1. 基本反向代理配置</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Nginx 是如何实现对多个后端服务器的负载均衡的？请描述其核心配置模块和默认分发算法。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Nginx 通过 `upstream` 模块配置负载均衡。首先使用 `upstream` 块定义一组后端服务器，然后在 `proxy_pass` 指令中引用该 `upstream` 块的名称。Nginx 默认使用的负载均衡算法是轮询（round-robin）。</div>
          </div>
          <div class="card-source">来源: 2.1. 配置负载均衡</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">当 Nginx 作为反向代理时，为什么通常需要配置 `X-Real-IP` 和 `X-Forwarded-For` 这两个请求头？它们分别传递了什么信息？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">配置这些请求头是为了让后端应用能够获取到客户端的真实信息，而不是代理服务器（Nginx）的信息。`X-Real-IP` 用于传递客户端的真实 IP 地址。`X-Forwarded-For` 用于传递一个包含客户端 IP 地址以及所有中间代理 IP 的地址链，便于追踪完整的请求来源。</div>
          </div>
          <div class="card-source">来源: 3.1. 设置请求头</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在 Nginx 中代理 WebSocket 连接需要配置哪两个关键的 HTTP 头部，以实现协议升级？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">为了代理 WebSocket 连接，必须在 Nginx 配置中设置 `Upgrade` 和 `Connection` 这两个 HTTP 头部。具体配置为 `proxy_set_header Upgrade $http_upgrade;` 和 `proxy_set_header Connection "upgrade";`。</div>
          </div>
          <div class="card-source">来源: 5.1. 配置 WebSocket 代理</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">配置</div>
          <div class="card-question">Nginx 配置代理缓存时，`proxy_cache_path` 和 `proxy_cache` 两个指令的作用分别是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">配置</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`proxy_cache_path` 指令用于定义缓存的存储路径、配置参数（如内存中 keys_zone 的名称和大小）以及磁盘上缓存的最大尺寸（max_size）。`proxy_cache` 指令则在具体的 location 块中使用，通过引用 `proxy_cache_path` 中定义的 keys_zone 名称来启用该位置的响应缓存。</div>
          </div>
          <div class="card-source">来源: 6.1. 配置缓存</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">配置</div>
          <div class="card-question">当 Nginx 需要通过 HTTPS 协议与后端服务器通信时，除了服务器需要配置 SSL/TLS 证书外，`proxy_pass` 指令需要做什么关键的修改？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">配置</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">当与后端服务器进行 HTTPS 通信时，`proxy_pass` 指令中指定的协议需要从 `http` 修改为 `https`。例如：`proxy_pass https://backend;`。</div>
          </div>
          <div class="card-source">来源: 4.1. 配置 HTTPS</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">在 Nginx 的反向代理配置中，`X-Forwarded-Proto` 请求头的作用是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`X-Forwarded-Proto` 请求头的作用是告知后端应用服务器，客户端最初发起请求时使用的协议是 HTTP 还是 HTTPS。</div>
          </div>
          <div class="card-source">来源: 3.1. 设置请求头</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">文档中提到了哪三个用于配置 Nginx 与后端服务器通信超时的指令？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档中提到了三个超时配置指令，分别是：`proxy_read_timeout`（读取后端响应超时）、`proxy_connect_timeout`（与后端建立连接超时）和 `proxy_send_timeout`（向后端发送请求超时）。</div>
          </div>
          <div class="card-source">来源: 7.1. 配置长连接</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">配置</div>
          <div class="card-question">如何使用 Nginx 缓存不同状态码的响应，并为它们设置不同的缓存有效期？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">配置</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">可以使用 `proxy_cache_valid` 指令来为不同 HTTP 状态码的响应设置不同的缓存时间。例如，`proxy_cache_valid 200 1m;` 表示对状态码为 200 的响应缓存 1 分钟，而 `proxy_cache_valid 404 10s;` 表示对 404 响应缓存 10 秒。</div>
          </div>
          <div class="card-source">来源: 6.1. 配置缓存</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
